package com.cencat.merchant.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.cencat.merchant.entity.MerchantUser;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 商家用户数据访问层
 * @author cencat
 * @since 2024-01-01
 */
@Mapper
public interface MerchantUserMapper extends BaseMapper<MerchantUser> {

    /**
     * 根据用户名查询用户
     * @param username 用户名
     * @return 用户信息
     */
    @Select("SELECT * FROM biz_merchant_user WHERE username = #{username} AND deleted = 0")
    MerchantUser selectByUsername(@Param("username") String username);

    /**
     * 根据手机号查询用户
     * @param phone 手机号
     * @return 用户信息
     */
    @Select("SELECT * FROM biz_merchant_user WHERE phone = #{phone} AND deleted = 0")
    MerchantUser selectByPhone(@Param("phone") String phone);

    /**
     * 根据邮箱查询用户
     * @param email 邮箱
     * @return 用户信息
     */
    @Select("SELECT * FROM biz_merchant_user WHERE email = #{email} AND deleted = 0")
    MerchantUser selectByEmail(@Param("email") String email);

    /**
     * 根据商家ID查询用户列表
     * @param merchantId 商家ID
     * @return 用户列表
     */
    @Select("SELECT * FROM biz_merchant_user WHERE merchant_id = #{merchantId} AND deleted = 0 ORDER BY sort_order ASC, create_time DESC")
    List<MerchantUser> selectByMerchantId(@Param("merchantId") Long merchantId);

    /**
     * 根据租户ID查询用户列表
     * @param tenantId 租户ID
     * @return 用户列表
     */
    @Select("SELECT * FROM biz_merchant_user WHERE tenant_id = #{tenantId} AND deleted = 0 ORDER BY create_time DESC")
    List<MerchantUser> selectByTenantId(@Param("tenantId") Long tenantId);

    /**
     * 根据状态查询用户列表
     * @param status 用户状态
     * @return 用户列表
     */
    @Select("SELECT * FROM biz_merchant_user WHERE status = #{status} AND deleted = 0 ORDER BY create_time DESC")
    List<MerchantUser> selectByStatus(@Param("status") String status);

    /**
     * 查询商家管理员用户
     * @param merchantId 商家ID
     * @return 管理员用户列表
     */
    @Select("SELECT * FROM biz_merchant_user WHERE merchant_id = #{merchantId} AND is_admin = 1 AND deleted = 0 ORDER BY create_time ASC")
    List<MerchantUser> selectAdminsByMerchantId(@Param("merchantId") Long merchantId);

    /**
     * 分页查询商家用户列表
     * @param page 分页参数
     * @param tenantId 租户ID
     * @param merchantId 商家ID（可选）
     * @param username 用户名（可选）
     * @param realName 真实姓名（可选）
     * @param phone 手机号（可选）
     * @param status 用户状态（可选）
     * @return 分页结果
     */
    IPage<MerchantUser> selectMerchantUserPage(IPage<MerchantUser> page,
                                              @Param("tenantId") Long tenantId,
                                              @Param("merchantId") Long merchantId,
                                              @Param("username") String username,
                                              @Param("realName") String realName,
                                              @Param("phone") String phone,
                                              @Param("status") String status);

    /**
     * 更新用户登录信息
     * @param userId 用户ID
     * @param loginTime 登录时间
     * @param loginIp 登录IP
     * @return 更新结果
     */
    @Update("UPDATE biz_merchant_user SET last_login_time = #{loginTime}, last_login_ip = #{loginIp}, login_count = login_count + 1 WHERE id = #{userId}")
    int updateLoginInfo(@Param("userId") Long userId, 
                       @Param("loginTime") LocalDateTime loginTime, 
                       @Param("loginIp") String loginIp);

    /**
     * 更新密码错误次数
     * @param userId 用户ID
     * @param errorCount 错误次数
     * @return 更新结果
     */
    @Update("UPDATE biz_merchant_user SET password_error_count = #{errorCount} WHERE id = #{userId}")
    int updatePasswordErrorCount(@Param("userId") Long userId, @Param("errorCount") Integer errorCount);

    /**
     * 锁定用户账号
     * @param userId 用户ID
     * @param lockTime 锁定时间
     * @return 更新结果
     */
    @Update("UPDATE biz_merchant_user SET lock_time = #{lockTime} WHERE id = #{userId}")
    int lockUser(@Param("userId") Long userId, @Param("lockTime") LocalDateTime lockTime);

    /**
     * 解锁用户账号
     * @param userId 用户ID
     * @return 更新结果
     */
    @Update("UPDATE biz_merchant_user SET lock_time = NULL, password_error_count = 0 WHERE id = #{userId}")
    int unlockUser(@Param("userId") Long userId);

    /**
     * 统计商家用户数量
     * @param merchantId 商家ID
     * @return 用户数量
     */
    @Select("SELECT COUNT(*) FROM biz_merchant_user WHERE merchant_id = #{merchantId} AND deleted = 0")
    Long countByMerchantId(@Param("merchantId") Long merchantId);

    /**
     * 统计租户用户数量
     * @param tenantId 租户ID
     * @return 用户数量
     */
    @Select("SELECT COUNT(*) FROM biz_merchant_user WHERE tenant_id = #{tenantId} AND deleted = 0")
    Long countByTenantId(@Param("tenantId") Long tenantId);
}